# Запуск RunaWFE на macOS (Apple Silicon)
### Developer Studio (Free / Professional) и Task Notifier
**Платформа:** Apple Silicon (M-серия), проверено на M4 · 

Все mac-сборки Developer Studio — **x86_64** (cocoa.x86_64), поэтому им нужны Rosetta 2 и **x86_64-JDK**. Нотификатор — наоборот, собран под **arm64** (cocoa SWT aarch64) и требует флаг `-XstartOnFirstThread`.

---

## 0. Предустановка и проверка (по шагам)

Что для чего нужно: **Rosetta + x86_64-JDK** — для Developer Studio (сборки x86_64); **JDK 11 + Maven** — для сборки/запуска Notifier; **Homebrew, Git** — общий инструментарий.

После каждой установки идёт команда проверки и **что должно появиться**.

### Шаг 1. Homebrew (менеджер пакетов)
Установка (если нет):
```
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
```
Проверка:
```
brew --version
```
Ожидается: строка вида `Homebrew 6.0.22` (номер может отличаться). Если команда не найдена — Homebrew не в PATH.

### Шаг 2. Rosetta 2 (эмуляция x86_64 — нужна студиям)
Установка:
```
softwareupdate --install-rosetta --agree-to-license
```
Проверка:
```
pgrep -q oahd && echo "Rosetta OK" || echo "нет Rosetta"
```
Ожидается: `Rosetta OK` (процесс `oahd` запущен). Доп. проверка: `arch -x86_64 /usr/bin/true; echo $?` → `0`.

### Шаг 3. Git
Проверка (обычно уже стоит с Xcode CLT):
```
git --version
```
Ожидается: `git version 2.54.0 (Apple Git-157)` (или новее). Если нет — поставится по `xcode-select --install`.

### Шаг 4. JDK 11 (для Notifier; подойдёт arm64)
Установка:
```
brew install --cask temurin@11
```
Проверка:
```
/usr/libexec/java_home -v 11
"$(/usr/libexec/java_home -v 11)/bin/java" -version
```
Ожидается: путь вида `.../Contents/Home` и версия `openjdk version "11.0.x"`. В общем списке `/usr/libexec/java_home -V` должна появиться строка `11.0.x (arm64) ...`.

### Шаг 5. x86_64-JDK (для Developer Studio — обязательно именно x64)
Вариант A — скачать Temurin 17 x64:
```
cd ~/Downloads
curl -L -o temurin17-x64.tar.gz "https://api.adoptium.net/v3/binary/latest/17/ga/mac/x64/jdk/hotspot/normal/eclipse"
mkdir -p x64jdk && tar -xzf temurin17-x64.tar.gz -C x64jdk
xattr -dr com.apple.quarantine x64jdk
```
Проверка (главное — архитектура **x86_64**):
```
file ~/Downloads/x64jdk/*/Contents/Home/bin/java
```
Ожидается: `... Mach-O 64-bit executable x86_64`. Если видите `arm64` — это НЕ тот JDK, студия не покажет окно.

> В сборке Free уже используется x64 **Amazon Corretto 11** из `~/IdeaProjects/runawfe-build-tools/jdk11-x64/...` — проверить так же командой `file`, ожидается `x86_64`.

### Шаг 6. Maven (для сборки Notifier)
Установка:
```
brew install maven
```
Проверка:
```
mvn -v
```
Ожидается: `Apache Maven 3.9.x` + строки `Java version:` и `Default locale/OS`. Maven возьмёт ту Java, что в `JAVA_HOME` (для сборки Notifier задаём JDK 11 — см. п.3 раздела Notifier).

### Шаг 7. Зависимости Notifier в локальном репозитории Maven
Notifier при сборке требует модуль сервера `wfe-webservice-client` и mac-SWT. Проверка наличия в `~/.m2`:
```
find ~/.m2/repository -path '*wfe-webservice-client*' -name '*.jar'
find ~/.m2/repository -path '*swt.cocoa.macosx.aarch64*' -name '*.jar'
```
Ожидается: по одному пути `.jar` в каждой команде. Если `wfe-webservice-client` отсутствует — собрать его из `~/IdeaProjects/runawfe-free-server` (`mvn install` соответствующего модуля); mac-SWT тянется из Maven Central автоматически.

### Итоговая проверка окружения (одной командой)
```
echo "brew: $(brew --version | head -1)"; \
pgrep -q oahd && echo "rosetta: OK"; \
echo "git: $(git --version)"; \
echo "mvn: $(mvn -v | head -1)"; \
echo "jdk11: $(/usr/libexec/java_home -v 11 2>/dev/null)"; \
echo "x64jdk: $(file ~/Downloads/x64jdk/*/Contents/Home/bin/java 2>/dev/null | grep -o x86_64)"
```
Ожидается: непустые значения во всех строках, у `x64jdk` — `x86_64`.

---

## 1. Developer Studio — Professional

**Приложение:** `~/Downloads/runa-gpd.app` (сборка `4.6.0.M20260821`, macosx.cocoa.x86_64).

**Симптом без фикса:** приложение «запускается» (процесс живёт), но **окно не появляется** — потому что x86_64-лончер Eclipse грузит JVM в свой процесс, а системные JDK — arm64.

**Разовая настройка (уже сделана):**
1. Снять карантин: `xattr -dr com.apple.quarantine ~/Downloads/runa-gpd.app`
2. Положить x86_64 JDK внутрь бандла: скопировать `<x86_64 JDK>/Contents/Home` → `~/Downloads/runa-gpd.app/Contents/Eclipse/jre`
3. В `~/Downloads/runa-gpd.app/Contents/Eclipse/runa-gpd.ini` добавить **перед** `-vmargs`:
   ```
   -vm
   ../Eclipse/jre/bin/java
   ```

**Запуск:** `open ~/Downloads/runa-gpd.app` (или двойной клик).

**Проверка запуска:**
```
pgrep -fl "runa-gpd.app/Contents/MacOS/runa-gpd"
```
Ожидается: строка с PID и путём к `runa-gpd` (процесс жив). Через несколько секунд на экране — **окно Developer Studio** (Eclipse Workbench). Память процесса ~400 МБ (`ps -o rss= -p <PID>`). Если процесс есть, а окна нет — см. Траблшутинг (нужен x86_64 JDK).

---

## 2. Developer Studio — Free

**Собранное приложение (из репозитория `runawfe-free-devstudio-4.6.2`):**
```
~/Downloads/runawfe-free-devstudio-4.6.2/plugins/ru.runa.gpd.maven/target/products/
  RunaWFE_DeveloperStudio/macosx/cocoa/x86_64/runa-gpd.app
```
Тоже x86_64. **Фикс уже встроен в сборку:** в её `runa-gpd.ini` прописан `-vm` на x86_64 **Amazon Corretto 11** из `~/IdeaProjects/runawfe-build-tools/jdk11-x64/amazon-corretto-11.jdk`. Карантина нет (локальная сборка).

**Запуск:** открыть этот `runa-gpd.app` (двойной клик или `open <путь>`).

**Проверка запуска:** так же — `pgrep -fl runa-gpd` (процесс жив) и появившееся окно студии. Заранее можно убедиться, что `-vm` указывает на существующий x86_64 JDK:
```
grep -A1 '^-vm$' "<путь>/runa-gpd.app/Contents/Eclipse/runa-gpd.ini"
file "$(grep -A1 '^-vm$' "<путь>/runa-gpd.app/Contents/Eclipse/runa-gpd.ini" | tail -1)"
```
Ожидается: путь к `.../bin/java` и `... x86_64`.

**Если переносишь на другую машину / в другое место:**
- убедиться, что x86_64 Corretto лежит по пути из `-vm`, **или** переписать `-vm` в `runa-gpd.ini` на актуальный x86_64 JDK (или встроить JRE в бандл, как в п.1);
- при необходимости снять карантин.

> Прочие цели сборки есть рядом: `.../products/RunaWFE_DeveloperStudio/{linux/gtk/{x86_64,aarch64}, win32/win32/x86_64}` — для Linux/Windows.

---

## 3. Task Notifier (клиент-оповещатель)

Фоновая программа в трее: опрашивает сервер и показывает уведомления о **новых заданиях/сообщениях**. Построена на SWT.

> Готовый **Linux**-дистрибутив на mac **не пойдёт** (там Linux/GTK SWT-нативы). Нужна mac-сборка.

**Сборка под mac** (репо `~/IdeaProjects/runawfe-free-notifier-java`):
```
JAVA_HOME=<JDK11> mvn clean package -DskipTests
```
Зависимости `wfe-webservice-client:4-SNAPSHOT` и `org.eclipse.swt.cocoa.macosx.aarch64:3.122.0` должны быть в `~/.m2` (уже есть). Результат: `target/rtn.jar` (uber-jar, cocoa-SWT), Main-Class `ru.runa.notifier.PlatformLoader`.

**Настройка на боевой стенд** — файл `~/Library/Preferences/runawfe-notifier/settings.properties`:
```
server.protocol=https
server.host=wf.processtech.ru
server.port=443
server.version=auto
userinput.default.login=<логин>
userinput.login.silently=false
```
Пароль в файл **не пишем** — вводится в окне. (`version=auto` читает `/wfe/version` → `4-SNAPSHOT`; SOAP-сервис `/wfe-service-4-SNAPSHOT/...` снаружи доступен по https.)

**Запуск:**
```
<JDK11>/bin/java -XstartOnFirstThread -jar ~/IdeaProjects/runawfe-free-notifier-java/target/rtn.jar
```
Или двойным кликом — лаунчер `~/Downloads/RunaNotifier.command` (сам добавляет `-XstartOnFirstThread`, JDK 11 и пишет лог в `~/Library/Logs/runawfe-notifier`).

**Проверка запуска:**
```
pgrep -fl rtn.jar
tail -n 5 ~/Library/Logs/runawfe-notifier/rtn.log
```
Ожидается: процесс `...java ... -jar .../rtn.jar` жив; в логе строка **`INFO [GUI] Running on cocoa`** (SWT поднялся). На экране — значок в системном трее и окно логина; после ввода пароля вместо `Retry?` пойдут уведомления о заданиях.

---

## Траблшутинг

| Симптом | Причина | Решение |
|---|---|---|
| Студия «запущена», но окна нет | нет x86_64 JDK (стоят только arm64) | `-vm` на x86_64 JDK или встроить JRE в бандл (п.1) |
| «Программа повреждена / из интернета» (Gatekeeper) | флаг quarantine | ПКМ → «Открыть» или `xattr -dr com.apple.quarantine <app>` |
| Нотификатор: диалог **`Retry?`** | не достучался до сервера | проверить `settings.properties` (host/protocol/port), доступность стенда |
| Нотификатор падает при старте | нет `-XstartOnFirstThread` | запускать с этим флагом (SWT/Cocoa) |
| Ошибка log4j `/rtn.log (Read-only)` | пишет лог в корень `/` | запускать из писчей папки (лаунчер уже делает `cd`) |

## Версии (на момент проверки)
- Developer Studio Professional: `4.6.0.M20260821`; Free: дистрибутив `4.6.2`.
- Сервер стенда wf.processtech.ru: `4-SNAPSHOT`.
- JDK: Studio — x86_64 (Temurin 17 / Corretto 11 x64); Notifier — JDK 11 (arm64 ok).
